#include <iostream>
#include <unistd.h>
#include <memory>
#include <ctime>
#include "ThreadPool.hpp"
#include "Task.hpp"
#include "Log.hpp"

// const char operators[] = {'+', '-', '*', '/', '%'};

// int main()
// {
//     srand(time(nullptr) ^ getpid() ^ pthread_self());

//     std::unique_ptr<ThreadPool<Task>> tp = std::make_unique<ThreadPool<Task>>(5); // C++14新特性
//     tp->InitThreadPool();
//     tp->Start();

//     int taskNum = 5; // 生成taskNum个任务
//     while(taskNum--)
//     {
//         int a = rand() % 100 + 1;
//         usleep(1234);
//         int b = rand() % 10 + 1;
//         usleep(123);
//         int c = rand() % 5;
//         Task t(a, b, operators[c]);
//         LOG(INFO, "main thread push task: %s", t.DebugToString().c_str());

//         tp->Push(t);
//         sleep(1);
//     }

//     tp->Stop();
//     tp->Wait();

//     return 0;
// }


// const char operators[] = {'+', '-', '*', '/', '%'};

int main()
{
    LOG(DEBUG, "程序已经被加载");
    sleep(3);
    // 第一次使用单例对象，会创建一个线程池对象
    ThreadPool<Task>::GetInstance();
    sleep(2);

    // 第二次及以后使用单例对象，直接获取，不会再创建线程池对象
    ThreadPool<Task>::GetInstance();
    sleep(2);

    ThreadPool<Task>::GetInstance();
    sleep(2);

    // 最后一次要等待线程join
    ThreadPool<Task>::GetInstance()->Wait();

    return 0;
}